package socket;

import java.io.*;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;

/**
 * 聊天室客户端
 */
public class Client {
    /**
     * java.net.Socket
     * 封装了TCP协议的通讯细节。我们基于它就可以与远端计算机建立TCP连接，
     * 并基于一对输入与输出流的读写完成与远端计算机的数据交互操作
     * 可以把"Socket"想象成电话
     */
    private Socket socket;

    /**
     * 构造器中完成初始化操作
     */
    public Client(){
        /**
         * Socket的构造器：
         * Socket(String host, int port)
         * 参数1：要连接的远端计算机（服务器）的IP地址
         * 参数2：要连接的运行在远端计算机上的服务端应用程序开启的服务端口
         * 通过IP地址可以找到网络上的服务器计算机，
         * 通过端口号可以连接到运行在该计算机上的服务端应用程序
         */
        try {
            System.out.println("正在连接服务端");
            socket = new Socket("localhost",8088);
            System.out.println("已连接服务器");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void start(){
        try {
            Thread thread = new Thread(new ServerHandler());
            thread.setDaemon(true);
            thread.start();
            /**
             * Socket提供的方法：
             * OutputStream getOutputStream()
             * 通过Socket获取一个字节输出流，使用该输出流写出的字节数据会发送给
             * 建立连接的远端计算机，而对方也可以通过建立连接的Socket获取输入流读取我们写出的字节
             */
            OutputStream outputStream = socket.getOutputStream();
            OutputStreamWriter osw = new OutputStreamWriter(outputStream, StandardCharsets.UTF_8);
            BufferedWriter bw = new BufferedWriter(osw);
            PrintWriter pw = new PrintWriter(bw,true);
            Scanner scanner = new Scanner(System.in);
            while (true){
                String str = scanner.nextLine();
                if ("exit".equalsIgnoreCase(str)){
                    break;
                }
                pw.println(str);
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        Client client = new Client();
        client.start();

    }
    private class ServerHandler implements Runnable{
        @Override
        public void run(){
            try {
                InputStream inputStream = socket.getInputStream();
                InputStreamReader isr = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
                BufferedReader br = new BufferedReader(isr);
                String line;
                while ((line = br.readLine())!= null)
                    System.out.println(line);
            }catch (IOException e){
            }
        }
    }
}
